#include "taskQueue.h"

#include <stdlib.h>
#include <strings.h>

int task_queue_init(task_queue_t *queue)
{
    // 参数检查
    if (queue == NULL)
    {
        return SYSTEM_ERR_INVALID_ARGUMENT;
    }

    // 初始化队列头尾指针和大小
    bzero(queue, sizeof(task_queue_t));
    queue->front = NULL;
    queue->rear = NULL;
    queue->size = 0;

    return SYSTEM_ERR_OK;
}

int task_node_create(user_session_t *session, task_node_t **new_node)
{
    // 参数检查
    if (session == NULL || new_node == NULL)
    {
        return SYSTEM_ERR_INVALID_ARGUMENT;
    }

    // 分配内存
    task_node_t *node = (task_node_t *)malloc(sizeof(task_node_t));
    if (node == NULL)
    {
        return SYSTEM_ERR_OUT_OF_MEMORY;
    }

    // 初始化任务节点
    node->session = session;
    node->next = NULL;

    // 输出新创建的任务节点指针
    *new_node = node;

    return SYSTEM_ERR_OK;
}

int enqueue_task(task_queue_t *queue, task_node_t *node)
{
    // 参数检查
    if (queue == NULL || node == NULL)
    {
        return SYSTEM_ERR_INVALID_ARGUMENT;
    }

    // 如果队列为空，更新头指针
    if (queue->size == 0)
    {
        queue->front = node;
    }
    else
    {
        // 否则将新节点链接到队列尾部
        queue->rear->next = node;
    }

    // 更新队列尾指针和大小
    queue->rear = node;
    queue->size++;

    return SYSTEM_ERR_OK;
}

int dequeue_task(task_queue_t *queue, task_node_t **node)
{
    // 参数检查
    if (queue == NULL || node == NULL)
    {
        return SYSTEM_ERR_INVALID_ARGUMENT;
    }

    // 检查队列是否为空
    if (queue->size == 0)
    {
        return SYSTEM_ERR_QUEUE_EMPTY;
    }

    // 取出队列头部的任务节点
    task_node_t *front_node = queue->front;
    *node = front_node;

    // 更新队列头指针和大小
    queue->front = front_node->next;
    queue->size--;

    // 如果队列变为空，更新尾指针为NULL
    if (queue->size == 0)
    {
        queue->rear = NULL;
    }

    return SYSTEM_ERR_OK;
}